#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>

#include <fcntl.h>
#include <sys/wait.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <dirent.h>

#include "config/config.h"
#include "get_index.h"


bool 
est_dossier(char *nom_fichier)
{
 
  struct stat sts;
  stat(nom_fichier,&sts);
  bool isdir = S_ISDIR(sts.st_mode);
  
  return isdir;
}

char*
generer_index(char *nom_dossier, char *titre)
{
  char *head_1="<html> <head> <title>";
  char *head_2=" </title> </head><body>\n<H2>Index :</H2>\n<UL>\
  <LI><img src=\"/.icons/icone_fleche.png\"		       \
align=TOP hspace= titre=\"parent directory\"			       \
width=20 height=20 <a href=\"../\">      ../</a>";
  
  char *aref_1="<LI><a href=\"";
  char *aref_2="\">";
  char *aref_3="</a>\n";

  char *foot="</UL><body></html>";

  int taille_index = strlen(head_1)+strlen(head_2)+strlen(titre)+1;
  char *index = malloc(sizeof(char) * taille_index);
  
  sprintf(index,"%s%s%s",head_1,titre,head_2);
  
  
  char *dossier = malloc(sizeof(char)*(strlen(ROOT)+strlen(nom_dossier)+1));
  strcpy(dossier,ROOT);
  strcat(dossier,nom_dossier);  
  char *ls = liste_fichier(dossier," ");
  
  char *ls_cpy = NULL;
  if (ls)
    ls_cpy = ls;
  while (ls != NULL)
    {
      int i = 0;
      for (; ls[i] != '\0' && ls[i] != ' ';i++)
	;
      
      if (i == 0)
	{
	  //pas cense venir ici
	  break;
	}

      char *nom_fichier = malloc(sizeof(char)*(i+1));

      strncpy(nom_fichier, ls, i);
      nom_fichier[i] = '\0';

      int taille_ligne = strlen(aref_1)+strlen(aref_2)+strlen(nom_dossier)+i*2+strlen(aref_3)+2;
      char *ligne = malloc(sizeof(char)*taille_ligne);
      
      sprintf(ligne,"%s%s/%s%s%s%s",aref_1,nom_dossier,nom_fichier,aref_2,nom_fichier,aref_3);

      if (taille_index < strlen(index) + taille_ligne)
	{
	  taille_index <<=1;

	  if (taille_index < strlen(index) + taille_ligne)
	    taille_index = strlen(index) + taille_ligne;

	  index = realloc(index, taille_index);
	}

      strcat(index, ligne);

      free(nom_fichier);
      free(ligne);
      nom_fichier = NULL;
      ligne = NULL;

      ls = strchr(ls,' ');
      if (ls == NULL)
	break;
      ls +=1;
    }

  if (ls_cpy)
    free(ls_cpy);

  free(dossier);
  ls_cpy = NULL;

  taille_index = strlen(index) + strlen(foot)+1;
  index = realloc(index, taille_index);
  strcat(index, foot);

  return index;
}


char*
liste_fichier(char *nom_dossier, char *separateur)
{
  struct dirent *lecture;
  DIR *repertoire= opendir(nom_dossier);
     
  char *s = NULL;
  int size = BUFFER_SIZE;
  
  int dossier_cpp = strstr(nom_dossier,"/cpp/") || strcmp(nom_dossier+(strlen(nom_dossier)-strlen("/cpp")),"/cpp") == 0;
  int strlen_cpp = strlen(".cpp");

  while ((lecture = readdir (repertoire)))
    {
      if (//strcmp(lecture->d_name,".") == 0 ||
	  //	  strcmp(lecture->d_name,PSWDF_NAME) == 0 ||
	  lecture->d_name[0]== '.' ||
	  lecture->d_name[strlen(lecture->d_name) -1 ] == '~'|| 
	  lecture->d_name[strlen(lecture->d_name) -1 ] == '#'||
	  (dossier_cpp && (strcmp(lecture->d_name,"footer.html") == 0 ||
			   strcmp(lecture->d_name,"header.html") == 0)))
	continue;
      
      int taille = sizeof(char) * (strlen(lecture->d_name)+ 1);
      
      if (lecture->d_type == 4) // 4 = repertoire !
	taille++;
      else
	if (dossier_cpp && strstr(lecture->d_name,".cpp"))
	  {
	    taille -= strlen_cpp + 1;
	  }
      
      if (taille > size)
	size = taille;

      s = malloc (size);

      if (!dossier_cpp)
	strcpy(s,lecture->d_name);
      else
	{
	  strncpy(s,lecture->d_name,taille);
	  s[taille] = '\0';
	}

      if (lecture->d_type == 4)
	strcat(s,"/\0");

      break;
    }
  
  while ((lecture = readdir(repertoire)))
    { 
      if (//strcmp(lecture->d_name,".") == 0 ||
	  //strcmp(lecture->d_name,PSWDF_NAME) == 0 ||
	  lecture->d_name[0]== '.'||
	  lecture->d_name[strlen(lecture->d_name) -1 ] == '~'|| 
	  lecture->d_name[strlen(lecture->d_name) -1 ] == '#'||
	  (dossier_cpp && (strcmp(lecture->d_name,"footer.html") == 0 ||
			   strcmp(lecture->d_name,"header.html") == 0)))
	continue;
      
      int taille =  strlen(s) + strlen(lecture->d_name) + strlen(separateur) + 1;
      if (lecture->d_type == 4) // 4 = repertoire !
	taille++;
      else
	if (dossier_cpp && strstr(lecture->d_name,".cpp"))
	  {
	    taille -= strlen_cpp + 1;
	  }

      if (size < taille)
	{
	  size <<= 1;

	  if (size < taille)
	    size = taille;
	  s = realloc (s, size);
	}
      strcat(s, separateur);
      
      if (!dossier_cpp)
	strcat(s, lecture->d_name);
      else
	{
	  strncat(s,lecture->d_name,taille);
	  // strcat(s,"\0");
	  s[taille]='\0';
	}

      if (lecture->d_type == 4)
	strcat(s,"/");
    }
  if (s)
    s = realloc(s, sizeof(char)*(strlen(s)+1));//peut poser probleme ?
  
  closedir(repertoire);
  return s;
}

char*
index_existe(char *nom_dossier)
{
  
  char *s=liste_fichier(nom_dossier," ");
  char *result= NULL;

  if (s)
    {
     
      if(strstr(s, "index.html ")!=NULL || strstr(s,"index.html\0") != NULL)
	{
	  result = malloc(sizeof(char)*(strlen("index.html")+1));
	  strcpy(result,"index.html");
	}
      else
	if(strstr(s, "index.htm ")!=NULL || strstr(s,"index.htm\0") != NULL)
	  {
	    result = malloc(sizeof(char)*(strlen("index.htm")+1));
	    strcpy(result,"index.htm");
	  }
			 
      free(s);
      s = NULL;
    }
  
  return result;
}


/*
 int
main(int argc,char* argv[])
{

  //Décommenter une de des fonctions pour en voir l'usage.
  char *s=index_existe(argv[1]);
  printf("%s\n",(s!=NULL?s:"(NULL)"));
  //printf("%s\n",liste_fichier(argv[1], " "));
  //printf("%s\n",generer_index(argv[1], argv[1]));

  return EXIT_SUCCESS;
  }*/

